﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace FacensaNet.BudgetDotCom.DomainModel
{
    /// <summary>
    /// Classe base para as entidades do sistema.
    /// </summary>
    public abstract class Entidade : IEntidade
    {
        protected const int IdNulo = -1;

        protected Entidade()
            : this(IdNulo)
        {
        }

        protected Entidade(int id)
        {
            Id = id;
        }

        /// <summary>
        /// Permite ler o valor do identificador único da entidade
        /// </summary>
        /// <value>O código numérico que representa a entidade.</value>
        /// <remarks>
        /// O método <c>set</c> desta propriedade foi marcado <c>protected internal</c>.
        /// Isso permite que subclasses ou classes que estejam na mesma assembly ou
        /// em assemblies "friend" possam setar esse valor.
        /// </remarks>
        public int Id { get; protected internal set; }

        /// <summary>
        /// Permite ler/escrever o nome da entidade.
        /// </summary>
        /// <value>O nome da entidade.</value>
        public string Nome { get; set; }

        /// <summary>
        /// Retorna um <c>bool</c> indicando se a entidade é nova (isto é, ainda não foi
        /// salva no banco) ou não.
        /// </summary>
        /// <value><c>true</c> se a entidade ainda não foi salva. Em caso contrário, <c>false</c>.</value>
        /// <remarks>
        /// Para saber se a entidade é nova, verifica-se o campo Id -- se ele contiver
        /// o valor <see>IdNulo</see>, é sinal de que esta entidade ainda não foi salva no banco.
        /// </remarks>
        public static bool EhNova(IEntidade entidade) { return entidade.Id == IdNulo; }
    }
}
